# 开发人: 余金晶
# 开发时间: 2022/12/9 23:33
import datetime
start = datetime.datetime.now()    #统计时间的开始
print('-'*57,'欢迎使用学生成绩查询系统','-'*57)  #查询系统的开始
import random   #随机分数的生成
score = []
for i in range(15):
    num = random.randint(35, 100)
    score.append(num)
    name = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O']
    dct = dict(zip(name, score))   #将分数列表和学生列表合成为学生字典
import matplotlib.pyplot as plt     #绘制学生成绩条形图
plt.bar(range(len(score)),score,tick_label=name)
#引用matplotlib库，生成柱状图（x轴数值，y轴数值，下标标签）
m=0    #计算程序运行时间
for j in range(1000):
        m=m+j
x=0  #查询次数的统计的开始
while True:        #建立菜单
    print('-'*135)
    print('请选择以下操作：')
    print('\t1查询所有学生成绩')
    print('\t2查询学生成绩排序')
    print('\t3查询平均分，最高分和最低分')
    print('\t4查询不及格人数')
    print('\t5查询学生成绩等级')
    print('\t6退出系统')
    user_choose=int(input('请选择[1-6]：'))
    print('-'*135)
    x += 1    #循环
    if user_choose == 1:   #输出字典
        print(dct)
    elif user_choose == 2:      #字典排序
        score_sorted = sorted(dct.items(), key=lambda x: x[1], reverse=True)
        score_dict_sorted = {}
        for rank, (sco_key, sco_val) in enumerate(score_sorted, 1):
            score_dict_sorted[sco_key] = (rank, sco_val)
        print(score_dict_sorted)
        #针对于排序后返回的是字典而不是元组的方法：
        #使用传递`sorted`函数的`key`参数的方法对字典进行排序
        #使用for循环结合内置函数enumerate重新构建排序后的字典
        #（enumerate函数的输出元组列表格式为(序号, ('student_x', 考试分数))）
        #重新构造带有排名的排序后的学生字典score_dict_sorted
        #（使用for循环可以依次读取enumerate中的内容，并重新构建学生字典。）
    elif user_choose == 3:    #计算平均分、最高分、最低分
                import numpy as np                #引用numpy对数组进行运算
                average = np.mean(score)
                max = np.max(score)
                min = np.min(score)
                print("|", "15位同学成绩的平均分是：", format(round(average, 2), "^111"), "|")
                print("|", "15位同学成绩的最高分是：", format(round(max, 2), "^111"), "|")
                print("|", "15位同学成绩的最低分是：", format(round(min, 2), "^111"), "|")
    elif user_choose == 4:    #统计不及格人数
        count = 0
        for i in score:
            if i < 60:
                count += 1
        print("15名同学中不及格人数为：", count)
    elif user_choose == 5:                  #输出学生成绩及等级
        def score_query(dct, strU):
            if strU in dct.keys():
                student_score = dct[strU]
                return student_score
            # （用def函数定义一个新函数score_query，设置两个形参dct和strU，让变量strU遍历（返回由字典所有键名组成的列表构成的）
            # dict_keys对象.让变量strU等于学生分数，如果strU是学生字典的键，返回学生分数的值；如果strU不是字典的键，则返回None。）
        i = 0
        while (True):
            try:
                import numpy as np
                average = np.mean(score)
                strU = str(input("请输入学生名字:"))     #调用函数score_query，输入学生姓名，得出相对应的值。
                print(score_query(dct, strU))
                i = i + 1
                if score_query(dct, strU) > average:
                    print("该学生成绩属于上等水平")
                    break
                if score_query(dct, strU) == average:
                    print("该学生成绩属于中等水平")
                    break
                if score_query(dct, strU) < average:
                    print("该学生成绩属于下等水平")
                    break
            except TypeError:      #对类型无效的操作
                print("请输入正确的学生名字!")
                i = i + 1
    elif user_choose == 6:    #退出系统
        print('-'*135)
        print('欢迎再次使用！')
        input('点击回车键退出！')
        break
    else:
        print('输入有误，请重新选择！')
print('-'*135)
end = datetime.datetime.now()    #统计查询时间的结束
runtime=end-start
print('查询时间：',runtime,'秒')    #输出查询时间，查询次数和成绩条形分析图
print('查询次数：',x)
plt.show()


















